玩转Android adb命令(adb降级)
1.adb简介
adb具有安装卸载apk、拷贝推送文件、查看设备硬件信息、查看应用程序占用资源、在设备执行shell命令等功能。
在Android SDK安装目录的platform-tools目录下找到adb工具。
adb在某种程度上有很大权限的,因为adb的设计初衷是为了方便开发人员调试,因此必然需要暴露一些权限以外的接口,利用这个特性可以绕开权限机制在非Root非定制机上做一些操作。
2.adb架构
adb是一个C/S架构的应用程序,由三部分组成
(1).运行在pc端的adb client
命令行程序”adb”用于从shell或脚本中运行adb命令。首先,“adb”程序尝试定位主机上的adb服务器,如果找不到adb服务器,“adb”程序自动启动一个adb服务器。接下来,当设备的adbd和pc端的adb server建立连接后,adb client就可以向adb servcer发送服务请求;
(2).运行在pc端的adb server
adb Server是运行在主机上的一个后台进程。它的作用在于检测USB端口感知设备的连接和拔除,以及模拟器实例的启动或停止,adb Server还需要将adb client的请求通过usb或者tcp的方式发送到对应的adbd上;
(3)运行在设备端的常驻进程adb demon(adbd)
程序“adbd”作为一个后台进程在Android设备或模拟器系统中运行。它的作用是连接adb服务器,并且为运行在主机上的客户端提供一些服务;
3.adb端口被占用
5037为adb默认端口,若5037端口被占用的解决方法
(1).找到使用该端口的进程pid
netstat -aon|findstr 5037
(2).通过pid找到对应的进程名(便于定位,可以跳过)
tasklist /fi "pid eq 5162"
(3).使用命令终止该命令的运行
taskkill /pid 5162 /f
4.基本用法
为命令指定目标设备
如果有多个设备/模拟器连接,则需要为命令指定目标设备
adb devices
adb -s 10.92.164.26:5555 install test.apk
启动adb server命令
adb start-server
停止adb server命令
adb kill-server
查看adb版本
adb version
以root权限运行adbd
adb的运行原理是PC端的adb server与手机端的守护进程adbd建立连接,然后PC端的adb client通过adb server转发命令,adbd接收命令后解析运行。
如果adbd以普通权限执行,有些需要root权限才能执行的命令无法直接用adb xxx执行。这时可以adb shell然后su后执行命令,也可以让adbd以root权限执行,就能随意执行高权限命令。
adb root
有些手机root后也无法通过adb root命令让adbd以root权限执行
adbd cannot run as root in production builds
先安装
adbd Insecure
然后
adb root
指定adb server的网络端口
adb -P <port> start-server
让设备在5555端口监听TCP/IP连接
adb tcpip 5555
通过IP地址连接设备
adb connect <device-ip-address>
断开无线连接
adb disconnect <device-ip-address>
无线连接(无需借助USB线)
需要root权限
su
setprop service.adb.tcp.port 5555
找到Android设备的IP地址
restart adbd
stop adbd
start adbd
5.应用管理
查看应用列表
adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]
在adb shell pm list packages的基础上可以加一些参数进行过滤查看不同的列表,支持的过滤参数,如下所示:
所有应用
adb shell pm list packages
系统应用
adb shell pm list packages -s
第三方应用
adb shell pm list packages -3
安装apk
adb install [-lrtsdg] <path_to_apk>
adb install后面可以跟一些可选参数来控制安装apk的行为,可用参数及含义,如下所示:
常见安装失败输出代码、含义及可能的解决办法,如下所示:
卸载应用
adb uninstall [-k] <packagename>
清除应用数据与缓存
adb shell pm clear <packagename>
查看前台Activity
adb shell dumpsys activity activities | grep mFocusedActivity
查看正在运行的Services
adb shell dumpsys activity services [<packagename>]
查看应用详细信息
adb shell dumpsys package <packagename>
6.与应用交互
主要是使用am <command>命令,常用的<command>
<INTENT>参数很灵活,和写Android程序时代码里的Intent相对应。
用于决定intent对象的选项如下:
<INTENT>里还能带数据,就像写代码时的Bundle一样
调起Activity
adb shell am start [options] <INTENT>
adb shell am start -n com.tx.mm/.ui.LauncherUI
adb shell am start -n org.mazhuang.boottimemeasure/.MainActivity --es "toast" "hello, world"
调起Service
adb shell am startservice [options] <INTENT>
adb shell am startservice -n com.tx.mm/.plugin.accountsync.model.AccountAuthenticatorService
发送广播
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n org.mazhuang.boottimemeasure/.BootCompletedReceiver
强制停止应用
adb shell am force-stop <packagename>
adb shell am force-stop com.tx.mobilesafe
禁用应用和启动
adb shell pm disable-user <packagename>
adb shell pm disable <packagename>
adb shell pm enable <packagename>
撤消应用程序的权限
(1).向应用授予权限。只能授予应用程序声明的可选权限
adb shell pm grant <packagename> <PACKAGE_PERMISSION>
adb -d shell pm grant packageName android.permission.BATTERY_STATS
(2).取消应用授权
adb shell pm revoke <packagename> <PACKAGE_PERMISSION>
选项--user user_id要禁用的用户
滑动解锁
adb shell input swipe 300 1000 300 500
7.查看日志
Android系统的日志分为两部分,底层的Linux内核日志输出到/proc/kmsg,Android的日志输出到/dev/log。
按tag和级别过滤日志
adb logcat ActivityManager:I MyApp:D *:S
adb logcat -v long ActivityManager:I *:S
清空日志
adb logcat -c
内核日志
adb shell dmesg
8.查看设备信息
型号
adb shell getprop ro.product.model
电池状况
adb shell dumpsys battery
屏幕分辨率
adb shell wm size
屏幕密度
adb shell wm density
显示屏参数
adb shell dumpsys window displays
android_id
adb shell settings get secure android_id
IMEI
adb shell dumpsys iphonesubinfo
Android系统版本
adb shell getprop ro.build.version.release
IP地址
adb shell ifconfig "| grep Mask"
Mac地址
adb shell cat /sys/class/net/wlan0/address
CPU信息
adb shell cat /proc/cpuinfo
内存信息
adb shell cat /proc/meminfo
更多硬件与系统属性
adb shell cat /system/build.prop
可通过adb shell getprop <属性名>命令单独查看
adb shell cat /system/build.prop | grep ro.product.cpu.abi
修改设置
修改设置之后,运行恢复命令有可能显示仍然不太正常,可以运行adb reboot重启设备,或手动重启。
修改设置的原理主要是通过settings命令修改如下路径里存放的设置值
/data/data/com.android.providers.settings/databases/settings.db
关闭USB调试模式
adb shell settings put global adb_enabled 0
状态栏和导航栏的显示隐藏
adb shell settings put global policy_control <key-values>
表示设置在所有界面下都同时隐藏状态栏和导航栏
adb shell settings put global policy_control immersive.full=*
表示设置在包名为com.package1和com.package2的应用里隐藏状态栏,在除了包名为com.package3的所有应用里隐藏导航栏
adb shell settings put global policy_control immersive.status=com.package1,com.package2:immersive.navigation=apps,-com.package3
恢复正常模式
adb shell settings put global policy_control null
屏幕截图
adb shell screencap -p /sdcard/sc.png
Linux和Windows
adb shell screencap -p | sed "s/\r$//" > sc.png
Mac OS X
adb shell screencap -p | gsed "s/\r$//" > sc.png
录制屏幕
adb shell screenrecord /sdcard/filename.mp4
重新挂载system分区为可写
adb shell
su
mount
重新挂载
mount -o remount,rw -t yaffs2 /dev/block/platform/msm_sdcc.1/by-name/system /system
查看连接过的WiFi密码
adb shell
su
cat /data/misc/wifi/*.conf
重启手机
adb reboot
检测设备是否已root
adb shell
su
使用Monkey进行压力测试
adb shell monkey -p <packagename> -v 500
开启WiFi
adb root
adb shell svc wifi enable
关闭WiFi
adb root
adb shell svc wifi disable
设置wifi优先,有网络和wifi情况下优先使用wifi
adb shell svc wifi prefer
开启/关闭数据流量
svc data disable
adb shell svc data enable
adb shell svc data prefer
9.刷机相关命令
重启到Recovery模式
adb reboot recovery
从Recovery重启到Android
adb reboot
重启到Fastboot模式
adb reboot bootloader
查看进程
adb shell ps
查看实时资源占用情况
adb shell top
查看进程UID
adb shell dumpsys package <packagename> | grep userId=
10.安全相关
启用SELinux
adb root
adb shell setenforce 1
禁用SELinux
adb root
adb shell setenforce 0
启用dm_verity
adb root
adb enable-verity
禁用dm_verity
adb root
adb disable-verity
11.常见问题
启动adb server失败
adb server进程想使用的5037端口被占用
netstat -ano | findstr LISTENING
taskkill /PID 12418
重启adb
推荐文章
Android系统中run-as和su命令的源码解析(升降权限)